package com.example.demo.controller;

import com.example.demo.common.AppVariable;
import com.example.demo.common.PasswordUtils;
import com.example.demo.common.ResultAjax;
import com.example.demo.model.Userinfo;
import com.example.demo.model.vo.UserinfoVO;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired//属性注入,得到操作数据库的service层的类
    private UserService userService;
    @RequestMapping("/reg")//注册
    public ResultAjax reg(Userinfo userinfo){
        //1,参数校验,检验名称和密码不为null和空
        if(userinfo==null || !StringUtils.hasLength(userinfo.getUsername()) ||!StringUtils.hasLength(userinfo.getPassword())){
            //前端传递的参数有问题
            return ResultAjax.fial(-1,"参数有问题");//调用失败的方法
        }
        //2,请求service进行数据库添加操作
        //密码加盐
        userinfo.setPassword(PasswordUtils.encrypt(userinfo.getPassword()));
        //走到这里代表参数没问题,可以添加到数据库中
       int result=userService.reg(userinfo);//调用添加的方法
        //3,将执行的结果返回给前端
        return ResultAjax.succ(result);//把影响的行数返回到前端
    }
    @RequestMapping("/login")//登录
    public ResultAjax login(UserinfoVO userinfoVO, HttpServletRequest request){
        //1,参数校验
        if(userinfoVO==null || !StringUtils.hasLength(userinfoVO.getUsername()) || !StringUtils.hasLength(userinfoVO.getPassword())){
            //传入的参数有问题
            return ResultAjax.fial(-1,"传入的参数有误");
        }
        //2,根据用户姓名来查询对象
        Userinfo userinfo=userService.getUserByName(userinfoVO.getUsername());//调用查询方法,得到对象
        if(userinfo==null || userinfo.getId()==0){//根据用户姓名查询没有查询到,或用户ID为0则代表数据库中不存在
            return ResultAjax.fial(-2,"用户名不存在");
        }
        //3,使用对象中的密码和通过username查询到的对象中的密码进行比较
        if(!PasswordUtils.decrypt(userinfoVO.getPassword(),userinfo.getPassword())){//登录的passwordMD5后和数据库中的最终密码进行比较
            //用户名有,但是传递来的密码错误
            return ResultAjax.fial(-2,"密码错误");
        }
        //4,比较成功后,将对象存储到session中
        HttpSession session=request.getSession();//获取session
        session.setAttribute(AppVariable.SESSION_USERINFO_KEY,userinfo);//存储session,内容是当前登录的用户信息
        //5,将结果返回到前端
        return ResultAjax.succ(1);//受影响的行数是1
    }
    @RequestMapping("logout") //注销功能的实现
    public ResultAjax logout(HttpServletRequest request){
        HttpSession session= request.getSession(false);//有就拿,没有也不创建
        if(session!=null &&session.getAttribute(AppVariable.SESSION_USERINFO_KEY)!=null){//session存在的情况
            session.removeAttribute(AppVariable.SESSION_USERINFO_KEY);//把当前登录用户的session删除
        }
        return ResultAjax.succ(1);//删除成功
    }

}
